type booleanFunc = (...args: any[]) => boolean;

/** 输入判断函数，在判断函数返回 false 的时候不对后面的判断函数进行执行; 但是通过所有判断函数时进行主函数执行并返回 */
export const validChain = <T extends booleanFunc, E>(
    funcs: T[],
    main: Function,
    caller?: E
) => {
    return (...args: any[]) => {
        for (const iterator of funcs) {
            const valid = iterator.apply(caller, args);
            if (valid === false) return false;
        }
        return main.apply(caller, args);
    };
};
